home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / phagexsources.lha / source / NewGFXZoom.s < prev    next >
Text File  |  1994-07-09  |  17KB  |  893 lines

  1. ; Use LMB to Quit, RMB for ZOOMING
  2. *****************************************************************************
  3. * 320 * 200 * 4 Piccy zoomer by phagex,  optimised to fuck, but watch for   *
  4. * AGA 8-bitplane zoomer!!!                                                  *
  5. *****************************************************************************
  6. * Basically first of all, all necessary data is pre-calculated into tables  *
  7. * as there would be no free VBL time to do it live.  Tables contain         *
  8. * co-ordinates for each zoom size of 0 to 159, these co-ordinates specify   *
  9. * (for zooming into) where the piccy should be scrolled outwards, and where *
  10. * a new line should be placed to fill the gap left by the scrolling.  This  *
  11. * process of scrolling and blitting a couple of lines is a LOT faster than  *
  12. * it would be blitting EACH line at a different position (like my earlier   *
  13. * efforts! i couldnt even blit 1 bitplane without slooow down!).  To do the *
  14. * Y axis even less is involved, all thats done is there is a modulo copper  *
  15. * setting on each copper line, and the modulos are set to miss out no-lines *
  16. * or several, depending on the zoom size! if only X axis could be done that *
  17. * way also!!     For zooming away from, scrolling is just used, the X pos   *
  18. * that is scrolled is just picked up from a table, just like zooming into.  *
  19. * Simple really! (hard to think of though!)                                 *
  20. *   I've documented this source, but not as well as i could have, sorry but *
  21. * aint got that much time!                                                  *
  22. *****************************************************************************
  23.  
  24.     Opt    c-
  25.     Section    "Zoomer Code",Code_c
  26.  
  27. Screen    = $c0000    ; Main memory base for piccy buffers!!
  28.  
  29.     IncDir    Df1:
  30.  
  31. Start    Movem.l    d0-d7/a0-a6,-(sp) 
  32.     Bsr    KillSys      
  33.     
  34.     Bsr    InitCopper    
  35.     Lea    ScreenBase(pc),a0
  36.     Move.l    #Screen,0(a0)
  37.     Move.l    #Screen+$7e40,4(a0)    
  38.     Lea    SizeVal(pc),a0
  39.     Move.w    #0,(a0)
  40.     Lea    ZoomCopper(pc),a0
  41.     Move.l    a0,$Dff080
  42.     Move.w    #$87c0,$Dff096
  43.     Bsr    TabInit
  44.     
  45.     Lea    CopperBCon(pc),a0
  46.     Move.w    #$4200,2(a0)    ; Switch on bitplanes
  47.     
  48.     Bsr    StartZoom    ; Do zoom Loop
  49.     
  50.     Lea    CopperBCon(pc),a0
  51.     Move.w    #$0200,2(a0)    ; Switch off bitplanes
  52.  
  53.     Bsr    ReturnSys      
  54.     Movem.l    (sp)+,d0-d7/a0-a6 
  55.     Moveq    #0,d0      
  56.     Rts
  57.  
  58. InitCopper    Move.w    #$2c01,d0
  59.     Move.w    #$fffe,d1
  60.     Move.l    #$01080078,d2
  61.     Move.l    #$010a0078,d3
  62.     Move.w    #$0100,d4
  63.     Move.w    #$f507,d5    
  64.     Lea    CopperMods(pc),a0
  65.     Move.l    a0,a2
  66.     
  67.     Move.w    #200,d7
  68. CopLoop1    Move.w    d0,(a0)+    ; Setup the copper with
  69.     Move.w    d1,(a0)+    ; plenty of Modulo
  70.     Move.l    d2,(a0)+    ; pointers...
  71.     Move.l    d3,(a0)+
  72.     Dbf    d7,CopLoop1
  73.  
  74.     Move.l    a2,a0
  75.     Move.w    #$3e,d0
  76.     Move.w    #201,d1
  77. CWaitLoop    Add.w    #1,d0    ; Set the copperlist wait
  78.     Move.b    d0,(a0)    ; instructions.
  79.     Cmpi.w    #$100,d0
  80.     Bne    PalCopper
  81.     Move.w    #$ffe1,(a0)    ; do PAL as well
  82.     Move.w    #0,d0    
  83. PalCopper    Add.l    #12,a0
  84.     Dbf    d1,CWaitLoop
  85.     
  86.     Move.l    ScreenBase(pc),a0
  87.     Move.l    a0,a1
  88.     Add.l    #$7e40*2,a1
  89.  
  90. ClearScreen    Move.l    #0,(a0)+    ; Simple Clear screen Loop
  91.     Cmp.l    a0,a1
  92.     Bne    ClearScreen
  93.     
  94.     Move.l    ScreenBase(pc),d2
  95.     Lea    CopperBPLS(pc),a0
  96.     Moveq    #3,d1
  97. SetBPLLoop    Move.l    d2,d0    ; Set main bitplane
  98.     Move    d0,6(a0)    ; pointers
  99.     Swap    d0
  100.     Move    d0,2(a0)
  101.     Add.l    #$a0,d2
  102.     Lea    8(a0),a0
  103.     Dbf    d1,SetBPLLoop
  104.  
  105.     Lea    PiccyCols(pc),a0
  106.     Lea    CopperCols(pc),a1
  107.     Moveq    #15,d0
  108. CopyCols    Move.w    (a0)+,2(a1)    ; Copy palette colours
  109.     Addq    #4,a1
  110.     Dbf    d0,CopyCols
  111.     Rts
  112.  
  113. WaitBlitter    Btst    #$6,$Dff002
  114.     Bne    WaitBlitter
  115.     Lea    $Dff000,a6
  116.     Rts
  117.  
  118. StartZoom    Lea    SizeVal(pc),a0    ; Set zoomsize to 0
  119.     Move.w    #0,(a0)
  120.  
  121. ZoomOut    Btst    #6,$Bfe001    ; Exit if Left mousey pressed
  122.     Beq    EndZoom
  123.     Btst    #2,$Dff016    ; Do zoom if right pressed
  124.     Bne    ZoomOut
  125.  
  126.     Move    SizeVal(pc),d0
  127.     Move.l    ScreenBase(pc),a0
  128.     Lea    160(a0),a0    ; Find Screen base data
  129.     Move.l    ScreenBase1(pc),a1
  130.     Lea    160(a1),a1
  131.     Lea    VarList(pc),a4
  132.     Add.l    #ZoomBitmap-VarList,a4
  133.     
  134.     Bsr    DoZoomOut    ; Do Zoom blitting GFX
  135.     
  136.     Bsr    VBL    ; wait Vert Blank
  137.     
  138.     Bsr    DoZoomCalc    ; Calculate copperlist
  139.             ; bitplanes!
  140.     Lea    SizeVal(pc),a0
  141.     Addq.w    #1,(a0)    ; Add 1 to Zoomsize
  142.     Cmpi.w    #160,(a0)
  143.     Blt    ZoomOut
  144.  
  145.     Subq.w    #1,(a0)
  146.  
  147. ZoomIn    Btst    #6,$Bfe001    ; This lot does same as above
  148.     Beq    EndZoom    ; only for zooming IN this
  149.     Btst    #2,$Dff016    ; time...
  150.     Bne    ZoomIn    ;
  151.  
  152.     Move.w    SizeVal(pc),d0
  153.     Move.l    ScreenBase(pc),a0
  154.     Lea    160(a0),a0
  155.     Move.l    ScreenBase1(pc),a1
  156.     Lea    160(a1),a1
  157.     Bsr    DoZoomIn
  158.     Bsr    VBL
  159.     Bsr    DoZoomCalc
  160.     Lea    SizeVal(pc),a0
  161.     Subq    #1,(a0)
  162.     Bpl    ZoomIn
  163.     Bra    StartZoom
  164.  
  165. EndZoom    Rts
  166.  
  167. VBL    Move.l    $Dff004,d0
  168.     And.l    #$1ff00,d0
  169.     Cmp.l    #$13000,d0
  170.     Bne    VBL
  171.     Rts
  172.     
  173. DoZoomCalc    Lea    ScreenBase(pc),a0
  174.     Move.l    0(a0),d0    ; Double buffer Base pointers
  175.     Move.l    4(a0),d1
  176.     Move.l    d0,4(a0)
  177.     Move.l    d1,0(a0)
  178.     
  179.     Lea    CopperBPLS(pc),a0
  180.     Moveq    #3,d7
  181. SetBPLoop    Move.l    d1,d2    ; Set next BPLS
  182.     Move.w    d2,6(a0)
  183.     Swap    d2
  184.     Move.w    d2,2(a0)
  185.     Addq    #8,a0
  186.     Add.l    #40,d1
  187.     Dbf    d7,SetBPLoop    
  188.     
  189.     Lea    CopperMods+6(pc),a0
  190.     Move.l    a0,d0
  191.     
  192.     Lea    $Dff000,a6
  193.     Bsr    WaitBlitter    
  194.     Move.l    d0,$54(a6)    ; Blitter clear buffer
  195.     Move.w    #-40,$74(a6)    
  196.     Move.w    #10,$66(a6)    
  197.     Move.l    #$ffffffff,$44(a6)    
  198.     Move.l    #$01f00000,$40(a6)    
  199.     Move.w    #$3241,$58(a6)
  200.  
  201.     Move.w    SizeVal(pc),d1    ; Get zoomsize value
  202.     Add.w    d1,d1
  203.     Add.w    d1,d1
  204.     Lea    ModTabList(pc),a0
  205.     Move.l    (a0,d1.w),a0    ; find modulo for size val
  206.  
  207.     Move.w    (a0)+,d1
  208.     Move.w    (a0)+,d2
  209.     Beq    NextBlit
  210.  
  211.     Lsl.w    #6,d2
  212.     Addq.w    #1,d2    ; Work out blitter size
  213.     
  214.     Ext.l    d1
  215.     Add.l    d0,d1
  216.  
  217.     Bsr    WaitBlitter    ; Copy block of modulos
  218.     Move.l    a0,$50(a6)
  219.     Move.l    d1,$54(a6)
  220.     Move.l    #$09f00000,$40(a6)
  221.     Move.w    #0,$64(a6)
  222.     Move.w    d2,$58(a6)
  223.  
  224. NextBlit    Bsr    WaitBlitter    ; Same or other block to
  225.     Move.l    d0,$50(a6)    ; blit copy modulo sizes
  226.     Addq.l    #4,d0
  227.     Move.l    d0,$54(a6)
  228.     Move.w    #10,$64(a6)
  229.     Move.l    #$09f00000,$40(a6)
  230.     Move.w    #$3241,$58(a6)
  231.     Bsr    WaitBlitter
  232.     Rts
  233.  
  234. TabInit    Lea    ZoomerTab(pc),a0
  235.     Lea    BitMapTab(pc),a1
  236.  
  237.     Moveq    #15,d0    ; Initialise main data Tables
  238. TabInitLoop1    Lea    WordTab(pc),a2
  239.     Move.w    (a1)+,d1
  240.     Move.w    #9,d2
  241.  
  242. TabInitLoop2    Move.w    (a2)+,d3
  243.     Asl.w    #4,d3
  244.     Add.w    d1,d3
  245.     Move.w    d3,(a0)+
  246.     Dbf    d2,TabInitLoop2
  247.     Dbf    d0,TabInitLoop1
  248.  
  249.     Lea    LineBaseTab(pc),a0
  250.     Move.w    #159,d0
  251.     Move.w    #2000,d1
  252. TabInitLoop3    Move.w    d1,(a0)+
  253.     Dbf    d0,TabInitLoop3
  254.  
  255.     Lea    ZoomerTab(pc),a0
  256.     Lea    ColCalcTab(pc),a1
  257.     Lea    LineBaseTab(pc),a2
  258.     Move.w    #0,d0
  259.  
  260. TabInitLoop4    Move.w    (a0,d0.w),d1
  261.     Moveq    #-2,d2
  262.  
  263. TabInitLoop5    Addq.w    #2,d2
  264.     Cmp.w    (a2,d2.w),d1
  265.     Bgt    TabInitLoop5
  266.  
  267.     Lea    318(a2),a3
  268.     Lea    (a2,d2.w),a4
  269.  
  270. TabInitLoop6    Move.w    -(a3),2(a3)
  271.     Cmpa.l    a4,a3
  272.     Bhi    TabInitLoop6
  273.  
  274.     Move.w    d1,(a4)
  275.     Lsr.w    #1,d2
  276.     Move.w    d2,(a1)+
  277.     Addq.w    #2,d0
  278.     Cmp.w    #160*2,d0
  279.     Blo    TabInitLoop4
  280.  
  281.     Lea    PicZoomList(pc),a2
  282.     Move.w    #0,(a2)+
  283.  
  284.     Move.w    #120,d0
  285.     Move.w    #160,d1
  286.     Move.w    #200,d2
  287.  
  288. TabInitLoop10    Move.w    d0,(a2)+
  289.     Add.w    d1,d0
  290.     Dbf    d2,TabInitLoop10
  291.  
  292.     Lea    ModuloTab(pc),a0
  293.     Lea    ModTabList(pc),a1
  294.     Lea    PicZoomList(pc),a2
  295.     Moveq    #1,d7
  296.  
  297.     Move.l    a0,(a1)+
  298.     Move.l    #0,(a0)+
  299.  
  300. TabInitLoop9    Move.l    a0,(a1)+
  301.     Moveq    #0,d6
  302.  
  303.     Move.w    d7,d0
  304.     Move.w    d7,d2
  305.     Mulu    #$a000,d0
  306.     Move.l    #$640000,d1
  307.     Sub.l    d0,d1
  308.     Swap    d1
  309.  
  310.     Add.w    d1,d1
  311.     Add.w    d1,d1
  312.     Add.w    d1,d6
  313.     Add.w    d1,d1
  314.     Add.w    d1,d6
  315.  
  316.     Add.l    d0,d0
  317.     Swap    d0
  318.  
  319.     Move.l    #$a000,d1
  320.     divu    d2,d1
  321.     Swap    d1
  322.     Move.w    #0,d1
  323.     Lsr.l    #8,d1
  324.  
  325.     Moveq    #0,d2
  326.     Moveq    #0,d4
  327.  
  328.     Move.w    d6,(a0)+
  329.     Move.w    d0,(a0)+
  330.     Addq.w    #1,-2(a0)
  331.     Bra    TabInitLoop7
  332.  
  333. TabInitLoop8    Add.l    d1,d2
  334.     Swap    d2
  335.     Move.w    d2,d3
  336.  
  337.     Sub.w    d4,d3
  338.     Add.w    d3,d3
  339.  
  340.     Move.w    (a2,d3.w),(a0)+
  341.     Move.w    d2,d4
  342.     Swap    d2
  343.  
  344. TabInitLoop7    Dbf    d0,TabInitLoop8
  345.  
  346.     Move.w    #201,d3
  347.     Sub.w    d4,d3
  348.     Add.w    d3,d3
  349.     Move.w    (a2,d3.w),(a0)+
  350.     Addq.w    #1,d7
  351.     Cmp.w    #160,d7
  352.     Bls    TabInitLoop9
  353.     Rts
  354.  
  355. DoZoomIn    Add.w    d0,d0    ; Get size val
  356.     Lea    ColCalcTab(pc),a2
  357.     Move.w    #$9f,d6
  358.     Sub.w    (a2,d0.w),d6    ; Use size as offset for
  359.             ; data table pickup
  360.     Move.l    a0,a2
  361.     Move.l    a1,a3
  362.  
  363.     Move.w    d6,d7    ; Get horizontal position
  364.     Not.w    d7    ; to start horiz scrolling
  365.     And.w    #$f,d7
  366.     Lsr.w    #4,d6
  367.     Move.w    d6,d5
  368.     Add.w    d5,d5
  369.  
  370.     Moveq    #38,d0
  371.     Sub.w    d5,d0
  372.     Move.w    d6,d1
  373.     Add.w    #$c801,d1
  374.  
  375.     Bsr    WaitBlitter
  376.     Move.l    #$fffffffe,$44(a6)
  377.     Movem.l    a0/a1,$50(a6)
  378.     Move.w    d0,$64(a6)
  379.     Move.w    d0,$66(a6)
  380.     Move.l    #$19f00000,$40(a6)
  381.     Move.w    d1,$58(a6)    ; Scroll data inwards at
  382.             ; horizontal point
  383.     Adda.w    d5,a0
  384.     Adda.w    d5,a1
  385.     Move.w    #0,d4
  386.     Bset    d7,d4
  387.     Subq.w    #1,d4
  388.  
  389.     Moveq    #38,d2
  390.     Bsr    WaitBlitter    
  391.     Movem.l    a0/a1,$50(a6)
  392.     Move.l    a1,$4c(a6)
  393.     Move.w    d2,$62(a6)
  394.     Move.w    d2,$64(a6)
  395.     Move.w    d2,$66(a6)
  396.     Move.w    #$ffff,$46(a6)
  397.     Move.w    d4,$70(a6)
  398.     Move.w    #$0de4,$40(a6)    ; Blitter clip line to make
  399.     Move.w    #$c801,$58(a6)    ; it look nice..
  400.  
  401.     Moveq    #18,d2
  402.     Sub.w    d5,d2
  403.     Beq    GetNextBlit    ; is copy necessary?
  404.     Moveq    #40,d3
  405.     Sub.w    d2,d3
  406.     Sub.w    d2,d3
  407.     Add.w    #$c800,d2    ; move on a screen or so.
  408.     Addq.w    #2,a0
  409.     Addq.w    #2,a1
  410.  
  411.     Bsr    WaitBlitter    
  412.     Movem.l    a0/a1,$50(a6)    ; blit it all back so it
  413.     Move.w    d3,$64(a6)    ; looks nice and smooooth
  414.     Move.w    d3,$66(a6)
  415.     Move.w    #$09f0,$40(a6)
  416.     Move.w    d2,$58(a6)
  417.  
  418. GetNextBlit    Lea    $7d00-2(a2),a2    ; now do the same to the 
  419.     Lea    $7d00-2(a3),a3    ; opposite side of the 
  420.     Bsr    WaitBlitter    ; screen..
  421.     Movem.l    a2/a3,$50(a6)
  422.     Move.w    #$7fff,$46(a6)
  423.     Move.w    d0,$64(a6)
  424.     Move.w    d0,$66(a6)
  425.     Move.l    #$19f00002,$40(a6)
  426.     Move.w    d1,$58(a6)    ; Blit scroll inwards to
  427.             ; centre
  428.     Eori.w    #$f,d7
  429.     Addq.w    #1,d7
  430.     Move.w    #0,d4    ; calculate clip for blit
  431.     Bset    d7,d4
  432.     Subq.w    #1,d4
  433.     Not.w    d4
  434.  
  435.     Moveq    #38,d2
  436.     Suba.w    d5,a2
  437.     Suba.w    d5,a3
  438.  
  439.     Bsr    WaitBlitter
  440.     Movem.l    a2/a3,$50(a6)    ; clip it so theres no
  441.     Move.l    a3,$4c(a6)    ; nasty remains
  442.     Move.w    d2,$62(a6)
  443.     Move.w    d2,$64(a6)
  444.     Move.w    d2,$66(a6)
  445.     Move.w    #$ffff,$46(a6)
  446.     Move.w    d4,$70(a6)
  447.     Move.w    #$0de4,$40(a6)
  448.     Move.w    #$c801,$58(a6)    ; hehe, all gone..
  449.     Rts
  450.  
  451. DoZoomOut    Lea    ColCalcTab(pc),a2
  452.     Add.w    d0,d0
  453.     Move.w    d0,-(sp)
  454.     Move.w    #$9f,d6
  455.     Sub.w    (a2,d0.w),d6    ; find our data with the
  456.             ; Size value again
  457.     Move.l    a0,a2
  458.     Move.l    a1,a3
  459.  
  460.     Move.w    d6,d7
  461.     And.w    #$f,d7
  462.     Lsr.w    #4,d6
  463.     Move.w    d6,d5
  464.     Add.w    d5,d5
  465.  
  466.     Lea    38(a0),a0
  467.     Lea    38(a1),a1
  468.     Suba.w    d5,a0
  469.     Suba.w    d5,a1
  470.  
  471.     Moveq    #38,d0    ; work out horizontal pos
  472.     Sub.w    d5,d0    ; for blitter scrolling
  473.     Move.w    d6,d1
  474.     Add.w    #$c801,d1
  475.  
  476.     Lea    $Dff000,a6
  477.     Bsr    WaitBlitter
  478.     Move.l    #$ffffffff,$44(a6)
  479.     Movem.l    a0/a1,$50(a6)
  480.     Move.w    d0,$64(a6)    ; scroll the piccy out 
  481.     Move.w    d0,$66(a6)    ; towards the edges...
  482.     Move.l    #$19f00000,$40(a6)
  483.     Move.w    d1,$58(a6)
  484.  
  485.     Lea    $7d00-4(a2),a0
  486.     Lea    $7d00-2(a3),a1
  487.     Suba.w    d5,a0
  488.     Suba.w    d5,a1
  489.  
  490.     Move.w    #0,d4    ; work out where gap is..
  491.     Addq.w    #1,d7
  492.     Bset    d7,d4
  493.     Subq.w    #1,d7
  494.     Subq.w    #1,d4
  495.     Not.w    d4
  496.  
  497.     Lea    $Dff000,a6
  498.     Moveq    #38,d2
  499.     Bsr    WaitBlitter
  500.     Move.l    a1,$4c(a6)
  501.     Move.l    a1,$50(a6)    ; fill in the gap left
  502.     Move.l    a1,$54(a6)    ; behind by the scroll with
  503.     Move.w    d2,$62(a6)    ; a new line from the
  504.     Move.w    d2,$64(a6)    ; origional piccy!!
  505.     Move.w    d2,$66(a6)
  506.     Move.w    d4,$70(a6)
  507.     Move.l    #$1de40002,$40(a6)
  508.     Move.w    #$c801,$58(a6)
  509.  
  510.     Subq.w    #2,a1
  511.  
  512.     Moveq    #18,d2
  513.     Sub.w    d5,d2
  514.     Beq    GetNextBlit1
  515.     Moveq    #40,d3
  516.     Sub.w    d2,d3
  517.     Sub.w    d2,d3
  518.  
  519.     Bsr    WaitBlitter    ; Copy to make the screen
  520.     Movem.l    a0/a1,$50(a6)    ; a wee bit tidier..
  521.     Move.w    d3,$64(a6)
  522.     Move.w    d3,$66(a6)
  523.     Move.w    d2,d3
  524.     Add.w    #$c800,d2
  525.     Move.w    #$09f0,$40(a6)
  526.     Move.w    d2,$58(a6)
  527.  
  528.     Add.w    d3,d3
  529.     Suba.w    d3,a0
  530.     Suba.w    d3,a1
  531.  
  532. GetNextBlit1    Bsr    WaitBlitter    ; do a scroll on the opposite
  533.     Movem.l    a0/a1,$50(a6)    ; side of the screen to make
  534.     Move.w    d0,$64(a6)    ; things look even again..
  535.     Move.w    d0,$66(a6)
  536.     Move.w    #$19f0,$40(a6)
  537.     Move.w    d1,$58(a6)
  538.  
  539.     Lea    (a3,d5.w),a1
  540.     Moveq    #38,d2    ; oops, our scrolling action
  541.     Move.w    #0,d4    ; seems to have left an 
  542.     Eori.w    #$f,d7    ; empty line again, lets
  543.     Bset    d7,d4    ; do the decent thing and 
  544.     Subq.w    #1,d4    ; fill it up shall we??
  545.  
  546.     Lea    $Dff000,a6
  547.     Bsr    WaitBlitter
  548.     Move.l    a1,$4c(a6)
  549.     Move.l    a1,$50(a6)
  550.     Move.l    a1,$54(a6)
  551.     Move.w    d2,$62(a6)
  552.     Move.w    d2,$64(a6)
  553.     Move.w    d2,$66(a6)
  554.     Move.w    d4,$70(a6)
  555.     Move.l    #$1de40000,$40(a6)
  556.     Move.w    #$c801,$58(a6)    ; yes, fill it in with GFX!
  557.  
  558.     Move.w    (sp)+,d0
  559.     Lea    ZoomerTab(pc),a2
  560.     Move.w    (a2,d0.w),d6
  561.     Move.w    #$9f,d1
  562.     Sub.w    d6,d1
  563.     Move.w    d1,d2    ; now then, we'll have to
  564.     Not.w    d2    ; make shure its all there
  565.     And.w    #$f,d2    ; (GFX that is)
  566.     Lsr.w    #4,d1
  567.     Add.w    d1,d1
  568.  
  569.     Lea    (a4,d1.w),a0    ; are we approaching last
  570.     Lea    (a3,d5.w),a1    ; blit???
  571.     Bsr    LastBlit
  572.  
  573.     Neg.w    d1
  574.     Lea    38(a4,d1.w),a0
  575.     Neg.w    d5
  576.     Lea    38(a3,d5.w),a1
  577.     Eor    #$f,d7
  578.     Eor    #$f,d2
  579.     Bsr    LastBlit
  580.     Rts
  581.  
  582. LastBlit    Move.w    #0,d4    ; do final clean up operation
  583.     Bset    d7,d4
  584.  
  585.     Move.w    d2,d3
  586.     Sub.w    d7,d3
  587.     Bmi    DoDescend    ; hmm, i'm going the other 
  588.             ; way thankyouverymuch.
  589.     Ror.w    #4,d3
  590.     Or.w    #$0de4,d3
  591.  
  592.     Bsr    WaitBlitter
  593.     Movem.l    a0/a1,$50(a6)
  594.     Move.l    a1,$4c(a6)
  595.     Move.w    d3,$40(a6)
  596.     Move.w    #0,$42(a6)
  597.     Move.w    d4,$70(a6)
  598.     Move.w    #$c801,$58(a6)
  599.     Rts
  600.  
  601. DoDescend    Neg.w    d3    ; opposite direction, GFX
  602.     Ror.w    #4,d3    ; line filled..
  603.     Or.w    #$0de4,d3
  604.  
  605.     Lea    799*40(a0),a0    ; point to the end of piccy
  606.     Lea    799*40(a1),a1    ; as mr. blitters going
  607.             ; backwards!!!
  608.     Bsr    WaitBlitter
  609.     Movem.l    a0/a1,$50(a6)
  610.     Move.l    a1,$4c(a6)
  611.     Move.w    d3,$40(a6)
  612.     Move.w    #2,$42(a6)
  613.     Move.w    d4,$70(a6)
  614.     Move.w    #$c801,$58(a6)
  615.     Rts
  616.  
  617. KillSys    Bsr.s    SysWait    
  618.  
  619.     Move.l    $4,a6    
  620.     Lea    GFXName(pc),a1    
  621.     Moveq    #0,d0    
  622.     Jsr    -552(a6)    
  623.         
  624.     Lea    OldCop1(pc),a5
  625.     Move.l    $26(a0),$0(a5)    
  626.     Move.l    $32(a0),$4(a5)    
  627.     
  628.     Lea    HardWare,a6
  629.     Move.w    IntEnaR(a6),d0    
  630.     Move.w    DMAConR(a6),d1  
  631.     Or.w    #$8000,d0    
  632.     And.w    #$03ff,d1    
  633.     Or.w    #$8000,d1    
  634.     Move.w    d0,$8(a5)    
  635.     Move.w    d1,$a(a5)    
  636.     
  637.     Move.w    #$7fff,IntEna(a6) 
  638.     Move.w    #$7fff,DMACon(a6) 
  639.     Rts
  640.  
  641. SysWait    Move.w    #15,d7    
  642. SysWaitLoop    Move.l    #$05000,d1    
  643.     Bsr.s    WaitVBL    
  644.     Bsr.s    DoWaitVBL    
  645.     Dbf    d7,SysWaitLoop    
  646.     Rts
  647.  
  648. DoWaitVBL    Move.l    #$03000,d1    
  649. WaitVBL    Movem.l    d0-d1/a6,-(sp)    
  650.     Lea    HardWare,a6    
  651. WaitVBLLoop    Move.l    VPosR(a6),d0    
  652.     And.l    #$1ff00,d0    
  653.     Cmp.l    d1,d0    
  654.     Bne.s    WaitVBLLoop    
  655.     Movem.l    (sp)+,d0-d1/a6    
  656.     Rts        
  657.  
  658. ReturnSys    Lea    HardWare,a6    
  659.     Move.w    OldIntEna(pc),IntEna(a6)
  660.     Move.w    OldDMACon(pc),DMACon(a6)
  661.     Move.l    OldCop1(pc),Cop1lc(a6)
  662.     Move.l    OldCop2(pc),Cop2lc(a6)
  663.     Rts
  664.  
  665. VarList
  666.  
  667. GFXName    Dc.b    "graphics.library",0
  668.     Even
  669. OldCop1    Dc.l    0    
  670. OldCop2    Dc.l    0    
  671. OldIntEna    Dc.w    0    
  672. OldDmaCon    Dc.w    0    
  673.  
  674. SizeVal    Dc.w    0    ; our luverly screen size
  675.  
  676. ZoomerTab    Dcb.w    160,0    ; X Co-ords for zoom scroll
  677. ColCalcTab     Dcb.w    160,0    ; X Co-ords for filling
  678. LineBaseTab    Dcb.w    160,0    ; Base for line pos calcs
  679.  
  680. WordTab    Dc.w    0,5,7,3,9,1,6,4,8,2   ; Word order
  681. BitMapTab    Dc.w    8,12,4,14,2,10,6,15   ; Pixel order
  682.     Dc.w    0,3,13,5,11,9,7,1     ; (both for blitter)
  683.             
  684. ScreenBase    Dc.l    $c0000    ; Piccy buffer 1
  685. ScreenBase1    Dc.l    $c7e40    ; Piccy buffer 2
  686.  
  687. PiccyCols    Dc.w    0,$fff,$eee,$ddd,$ccc,$bbb,$aaa,$999
  688.     Dc.w    $888,$777,$666,$555,$444,$333,$222,$111
  689.     Dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  690.     
  691. Cmv    Macro
  692.     Dc.w    \2,\1
  693.     EndM
  694.     
  695. Cwt    Macro
  696.     Dc.w    (\1*$100)+$01,$fffe
  697.     EndM    
  698.  
  699. Pal    Macro
  700.     Dc.w    $ffe1,$fffe
  701.     EndM    
  702.  
  703. EndCop    Macro
  704.     Dc.w    $ffff,$fffe
  705.     EndM    
  706.  
  707. ZoomCopper    Cwt    $15    
  708.     Cmv    $0200,BplCon0    
  709.     Cmv    $00bb,BplCon1    
  710.     Cmv    $000a,BplCon2    
  711.     Cmv    $0034,DdfStrt    
  712.     Cmv    $00c8,DdfStop    
  713.     Cmv    $1651,DiwStrt    
  714.     Cmv    $36c1,DiwStop
  715.     Cmv    $78,BplMod1    
  716.     Cmv    $78,BplMod2    
  717.     
  718.     Cwt    $25        
  719. CopperCols    Cmv    $0000,Color00
  720.     Cmv    $0fff,Color01
  721.     Cmv    $0000,Color02
  722.     Cmv    $0fff,Color03
  723.     Cmv    $0000,Color04
  724.     Cmv    $0fff,Color05
  725.     Cmv    $0000,Color06
  726.     Cmv    $0fff,Color07
  727.     Cmv    $0000,Color08
  728.     Cmv    $0fff,Color09
  729.     Cmv    $0000,Color10
  730.     Cmv    $0fff,Color11
  731.     Cmv    $0000,Color12
  732.     Cmv    $0fff,Color13
  733.     Cmv    $0000,Color14
  734.     Cmv    $0fff,Color15
  735.     Cmv    $0000,Color16
  736.     Cmv    $0fff,Color17
  737.     Cmv    $0000,Color18
  738.     Cmv    $0fff,Color19
  739.     Cmv    $0000,Color20
  740.     Cmv    $0fff,Color21
  741.     Cmv    $0000,Color22
  742.     Cmv    $0fff,Color23
  743.     Cmv    $0000,Color24
  744.     Cmv    $0fff,Color25
  745.     Cmv    $0000,Color26
  746.     Cmv    $0fff,Color27
  747.     Cmv    $0000,Color28
  748.     Cmv    $0fff,Color29
  749.     Cmv    $0000,Color30
  750.     Cmv    $0fff,Color31
  751.     
  752. CopperBPLS    Cmv    $0,BplPt0h
  753.     Cmv    $0,BplPt0l    
  754.     Cmv    $0,BplPt1h    
  755.     Cmv    $0,BplPt1l    
  756.     Cmv    $0,BplPt2h    
  757.     Cmv    $0,BplPt2l    
  758.     Cmv    $0,BplPt3h    
  759.     Cmv    $0,BplPt3l    
  760.     Cmv    $0,BplPt4h
  761.     Cmv    $0,BplPt4l 
  762.     
  763.     Cwt    $3f
  764. CopperBCon    Cmv    $0200,BplCon0
  765.  
  766. CopperMods    Ds.w    202*6    ; Copper instructions for
  767.             ; bitplane use                    
  768.     EndCop
  769.  
  770. PicZoomList    Dcb.w    202,0    ; Y co-ord line base
  771. ModTabList    Dcb.l    161,0    ; Modulo pointers
  772. ModuloTab    Dcb.b    33044    ; Pre-calced modulos!
  773.  
  774. ZoomBitmap    Incbin    df0:BitMaps/Transorb.Raw  ; piccy!
  775.  
  776.  
  777. ****Custom Chip Registers****
  778.  
  779. Hardware    = $Dff000
  780.  
  781.  
  782. ;Control Registers
  783.  
  784. Dmaconr    = $002
  785. Vposr    = $004
  786. Vhposr    = $006
  787. Joy0dat    = $00A
  788. Joy1dat    = $00C
  789. Clxdat    = $00E
  790. Intenar    = $01C
  791. Intereqr    = $01E
  792. Copcon    = $02E
  793.  
  794. ;Blitter Registers
  795.  
  796. Bltcon0    = $040
  797. Bltcon1    = $042
  798. Bltafwm    = $044
  799. Bltalwm    = $046
  800. Bltcpth    = $048
  801. Bltcptl    = $04A
  802. Bltbpth    = $04C
  803. Bltbptl    = $04E
  804. Bltapth    = $050
  805. Bltaptl    = $052
  806. Bltdpth    = $054
  807. Bltdptl    = $056
  808. Bltsize    = $058
  809. Bltcmod    = $060
  810. Bltbmod    = $062
  811. Bltamod    = $064
  812. Bltdmod    = $066
  813. Bltcdat    = $070
  814. Bltbdat    = $072
  815. Bltadat    = $074
  816.  
  817. ;Copper Registers
  818.  
  819. Cop1lc    = $080
  820. Cop1lch    = $080
  821. Cop1lcl    = $082
  822. Cop2lc    = $084
  823. Cop2lch    = $084
  824. Cop2lcl    = $086
  825. Copjmp1    = $088
  826. Copjmp2    = $08A
  827. Diwstrt    = $08E
  828. Diwstop    = $090
  829. Ddfstrt    = $092
  830. Ddfstop    = $094
  831. Dmacon    = $096
  832. Clxcon    = $098
  833. Intena    = $09A
  834. Intreq    = $09C
  835.  
  836. ;BitPlane Registers 
  837.  
  838. BplCon0    = $100
  839. BplCon1    = $102
  840. BplCon2    = $104
  841. BplMod1    = $108
  842. BplMod2    = $10a
  843.  
  844. BplPt0h    = $0e0
  845. BplPt0l    = $0e2
  846. BplPt1h    = $0e4
  847. BplPt1l    = $0e6
  848. BplPt2h    = $0e8
  849. BplPt2l    = $0ea
  850. BplPt3h    = $0ec
  851. BplPt3l    = $0ee
  852. BplPt4h    = $0f0
  853. BplPt4l    = $0f2
  854. BplPt5h    = $0f4
  855. BplPt5l    = $0f6
  856.  
  857. ;Colour Registers
  858.  
  859. Color00    = $180
  860. Color01    = $182
  861. Color02    = $184
  862. Color03    = $186
  863. Color04    = $188
  864. Color05    = $18a
  865. Color06    = $18c
  866. Color07    = $18e
  867. Color08    = $190
  868. Color09    = $192
  869. Color10    = $194
  870. Color11    = $196
  871. Color12    = $198
  872. Color13     = $19a
  873. Color14     = $19c
  874. Color15     = $19e
  875. Color16     = $1a0
  876. Color17     = $1a2
  877. Color18     = $1a4
  878. Color19     = $1a6
  879. Color20     = $1a8
  880. Color21     = $1aa
  881. Color22     = $1ac
  882. Color23     = $1ae
  883. Color24     = $1b0
  884. Color25     = $1b2
  885. Color26     = $1b4
  886. Color27     = $1b6
  887. Color28     = $1b8
  888. Color29     = $1ba
  889. Color30     = $1bc
  890. Color31     = $1be
  891.  
  892. EcsNop    = $1fe
  893.